package jwcb.portal.server.controller;

import jakarta.validation.constraints.Pattern;
import jwcb.admin.api.user.domain.dto.UserEditReqDTO;
import jwcb.javapjframework.common.domain.domain.R;
import jwcb.javapjframework.common.domain.domain.vo.TokenVO;
import jwcb.javapjframework.common.security.domain.dto.TokenDto;
import jwcb.portal.server.domain.dto.PhoneLoginDto;
import jwcb.portal.server.domain.dto.UserDTO;
import jwcb.portal.server.domain.dto.WechatLoginDto;
import jwcb.portal.server.domain.vo.UserVo;
import jwcb.portal.server.service.IUserService;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

/**
 * 门户程序用户入口
 */
@RestController
@RequestMapping("/user")
@Validated
public class UserController {

    @Autowired
    private IUserService userService;


    /**
     * 微信登录
     * @param wechatLoginDto 微信登录信息
     * @return token信息
     */
    @PostMapping("/login/wechat")
    public R<TokenVO> loginWechat(@Validated  @RequestBody WechatLoginDto wechatLoginDto) {
        TokenDto tokenDto = userService.login(wechatLoginDto);
        TokenVO tokenVO = new TokenVO();
        BeanUtils.copyProperties(tokenDto,tokenVO);
        return R.ok(tokenVO);
    }


    /**
     * 发送短信验证码
     * @param phone 手机号
     */
    @GetMapping("/send_sms_code")
    public R<Void> sendSmsCode(@RequestParam @Pattern(regexp = "^1[3-9]\\d{9}$",message = "手机号格式不正确") String phone) {
        userService.sendSmsCode(phone);
        return R.ok();
    }


    /**
     * 手机号登录
     * @param phoneLoginDto 手机登录信息
     * @return
     */
    @PostMapping("/login/phone")
    public R<TokenVO> loginPhone(@RequestBody @Validated PhoneLoginDto phoneLoginDto) {
        TokenDto tokenDto = userService.login(phoneLoginDto);
        TokenVO tokenVO = new TokenVO();
        BeanUtils.copyProperties(tokenDto,tokenVO);
        return R.ok(tokenVO);
    }


    /**
     * 修改用户信息
     * @param userEditReqDTO C端用户编辑DTO
     * @return void
     */
    @PostMapping("/edit")
    public R<Void> edit(@RequestBody @Validated UserEditReqDTO userEditReqDTO) {
        userService.edit(userEditReqDTO);
        return R.ok();
    }



    /**
     * 获取用户登录信息
     * @return 用户信息VO
     */
    @GetMapping("/login_info/get")
    public R<UserVo> getLoginUser() {
        UserDTO loginUser = userService.getLoginUser();
        UserVo userVo = new UserVo();
        BeanUtils.copyProperties(loginUser,userVo);
        return R.ok(userVo);
    }

    /**
     * 退出登录
     * @return void
     */
    @DeleteMapping("/logout")
    R<Void> logout() {
        userService.logout();
        return R.ok();
    }

}
